C++ 的拷贝构造函数

构造函数是一种特殊的构造函数.

特点

  • 拷贝构造函数名字与类名相同,并且不能指定返回类型.
  • 拷贝构造函数只能有一个参数,并且该参数是该类的对象的引用.
  • 它不能被显式调用,在以下三种情况下会被自动调用:

    • 用一个类的对象去初始化该类的另一个对象时

      1
      2
      3
      4
      5
      6
      7
      Point p1(3, 4);
      Point p2 = p1;

      //注意,这种情况下不会调用拷贝构造函数:
      Point p1(3, 4);
      Point p2;
      p2 = p1;
    • 当函数的形参是类的对象,进行形参和实参结合时???

      1
      2
      3
      4
      Point func(Point p);    //有一个函数的形参是类的对象
      ....
      p2 = func(p1); //p1, p2 都是对象.
      //当用 p1 初始化形参 p 时调用拷贝构造函数
    • 当函数的返回值是类的对象,函数执行完成进行返回时

      1
      2
      3
      Point p;
      ...
      return p;

作用

用一个已经存在的对象去初始化另一个对象,为了保证引用的对象不被修改,通常把引用参数声明为 const 参数(这样引用就相当于一个常量). 格式如下:

1
2
3
4
<类名>::<类名>(const <类名> & <对象名>)
{
<函数体>
}

1
2
3
4
Point::Point(const Point & p)
{
cout<<"Copy constructor is called!";
}

使用

如果没有定义拷贝构造函数, 本身应该是有的. 比如在函数传递的时候, 形参拷贝了实参的数据. (因为定义了拷贝构造函数但是里面什么也没做的话, 发现形参里的对象的数据成员是垃圾值. )

所以如果定义了拷贝构造函数至少要进行数据的拷贝.

1
2
3
4
5
6
7
//在类的声明中
<类名>(const <类名> & <对象名>);
比如:
Point(const Point & p);

//具体实现
//上面写了